package com.app.miwawa.cui.esm;

import javax.annotation.Resource;

import org.framework.common.api.service.bo.CommonBoAware;
import org.framework.common.api.support.model.ProcessModel;
import org.framework.common.cui.AbstractController;
import org.framework.common.ext.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.app.miwawa.api.esm.entity.contract.Contract;
import com.app.miwawa.api.esm.entity.contract.Refund;
import com.app.miwawa.api.esm.entity.contract.Stopinfo;
import com.app.miwawa.api.esm.entity.customer.Customer;
import com.app.miwawa.api.esm.service.bo.ContractBo;


/**
 * 用户界面请求控制器类
 * <p>描述: 合同</p>
 * <p>Company: Professional</p>
 * @author chanlong(陈龙)
 * @date 2016年1月23日 上午9:13:11
 * @version 1.0.2016
 */
@RestController
public class ContractController extends AbstractController{
	
	@Autowired
	private ContractBo contractBo;
	
	@Resource(name="defaultBo")
	private CommonBoAware<Stopinfo,String> stopInfoBo;
	
	/**
	 * 保存合同信息.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:14:20
	 */
	@RequestMapping("/{dbname}/contract/save")
	public Object save(@PathVariable final String dbname, @ModelAttribute final Contract entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			String code = entity.getCode();
			
			// 设置编码
			entity.setCode(StringUtil.isNotEmpty(code) ? code : contractBo.maxcode());

			// 保存实体对象
			return contractBo.insert(entity);
		} catch (Exception e) {
			return error("保存合同信息失败！", e);
		}
	}
	
	/**
	 * 更新合同信息（顾问分配）.
	 * @param dbname
	 * @param ids
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:13:43
	 */
	@RequestMapping("/{dbname}/contract/update/{ids}")
	public Object update(@PathVariable final String dbname, @PathVariable final String[] ids, @ModelAttribute final Customer entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			// 更新实体对象
			Integer result = contractBo.update(ids, entity);
			
			return success(result);
		} catch (Exception e) {
			return error("更新合同信息失败！", e);
		}
	}
	
	/**
	 * 停课
	 * @param dbname
	 * @param ids
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:07:29
	 */
	@RequestMapping("/{dbname}/contract/stop/{studentid}")
	public Object stop(@PathVariable final String dbname,@PathVariable final String studentid,@ModelAttribute final Stopinfo entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			if(entity != null && stopInfoBo.insert(entity) != null){
				ProcessModel process = ProcessModel.factory();
				process.jdbc.update(process.properties.getProperty("contract.stop"), studentid);
				return success("停课成功");
			}else{
				return error("停课失败！");
			}
		} catch (Exception e) {
			return error("停课失败！", e);
		}
	}
	
	/**
	 * 停课会员还原.
	 * @param dbname
	 * @param ids
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:07:29
	 */
	@RequestMapping("/{dbname}/contract/reback")
	public Object reback(@PathVariable final String dbname, @ModelAttribute final Contract entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			if(contractBo.update(entity) == null){
				return error("仅当执行中的合同耗课结束，续签合同才可启用！");
			}else{
				ProcessModel process = ProcessModel.factory();
				process.jdbc.update(process.properties.getProperty("contract.reback"), entity.getId());
				return success("恢复停课会员成功！");
			}
			
		} catch (Exception e) {
			return error("恢复停课会员失败！", e);
		}
	}
	
	/**
	 * 合同终止及退费.
	 * @param dbname
	 * @param ids
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:07:29
	 */
	@RequestMapping("/{dbname}/contract/refund")
	public Object refund(@PathVariable final String dbname, @ModelAttribute final Refund entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			// 退费
			return contractBo.refund(entity);
		} catch (Exception e) {
			e.printStackTrace();
			return error("会员退费及终止失败！", e);
		}
	}
}
